package ar.edu.utn.frsf.tpae.a2012.g05.service.impl;

import java.math.BigDecimal;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import ar.edu.utn.frsf.tpae.a2012.g05.dao.CuentaDao;
import ar.edu.utn.frsf.tpae.a2012.g05.dao.MovimientoDao;
import ar.edu.utn.frsf.tpae.a2012.g05.entity.Cuenta;
import ar.edu.utn.frsf.tpae.a2012.g05.entity.Movimiento;
import ar.edu.utn.frsf.tpae.a2012.g05.entity.Pago;
import ar.edu.utn.frsf.tpae.a2012.g05.exception.NegocioException;
import ar.edu.utn.frsf.tpae.a2012.g05.service.CuentaService;
import ar.edu.utn.frsf.tpae.a2012.g05.service.MovimientoService;

@Service
public class MovimientoServiceImpl implements MovimientoService {

	@Autowired  @Qualifier("movimientoDaoImpl")
	private MovimientoDao movimientoDao;
	
	@Autowired  @Qualifier("cuentaDaoImpl")
	private CuentaDao cuentaDao;
	
	@Autowired
	private CuentaService cuentaService;
	
	public List<Movimiento> findMovimientosCuenta(Integer idCuenta)  throws NegocioException{
		
		Cuenta cuenta = null;
		try {
			cuenta = cuentaDao.findById(idCuenta);
			if(cuenta == null)
				throw new Exception();	
		} catch (Exception e) {
			throw new NegocioException("La cuenta no existe.");
		}
		return movimientoDao.findByIdCuenta(idCuenta);
	}

	public Pago realizarPago(Pago pago) throws NegocioException {
		if(pago.getMonto().compareTo(BigDecimal.ZERO) <= 0) {
			throw new NegocioException("El monto del pago debe ser positivo");
		}
		// debito el monto de la cuenta
		cuentaService.debitar(pago.getCuenta(), pago.getMonto());
		// el pago debe ser un monto negativo en los movimientos
		pago.setMonto(pago.getMonto().negate());
		// guardo el movimiento
		try {
			movimientoDao.saveOrUpdate(pago);
		} catch (Exception e) {
			throw new NegocioException("no se pudo guardar en la base de datos");
		}
		
		return pago; 
	}
	
	public void setMovimientoDao(MovimientoDao movimientoDao) {
		this.movimientoDao = movimientoDao;
	}

	public void setCuentaDao(CuentaDao cuentaDao) {
		this.cuentaDao = cuentaDao;
	}

	public void setCuentaService(CuentaService cuentaService) {
		this.cuentaService = cuentaService;
	}
}
